////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011-2012 www.iflytek.com. All Rights Reserved.
//  This software for customer relationship management system, developed by Noo team.
//  Software code and design for the team, copy rights reserved.
////////////////////////////////////////////////////////////////////////////////

package com.iflytek.ci.main.repository;

import java.io.File;
import java.io.IOException;

import com.mongodb.DB;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
import org.apache.log4j.Logger;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.stereotype.Repository;

/**
 * <p>
 * .
 * </p>
 *
 * @author poplar.yfyang
 * @version 1.0 2012-10-31 12:03 AM
 * @since JDK 1.5
 */
@Repository
public class AttachmentRepository {

	/** 日志 */
	private static final Logger LOGGER = Logger.getLogger(AttachmentRepository.class);
	/** 存储的MongoDB的表名 */
	private static final String FS_NAME = "CI_ATTACHMENT";
	/** DB数据库对象 */
	private final DB db;

	/**
	 * 注入mongdoDB工厂实例，构建DB对象
	 *
	 * @param mongoDbFactory 工厂实例
	 */
	@Autowired
	public AttachmentRepository(MongoDbFactory mongoDbFactory) {
		db = mongoDbFactory.getDb();
	}

	/**
	 * 保存文件到MongoDB中，使用MongdoDB的GridFs文件系统。
	 *
	 * @param fileName 文件名称
	 * @param file     文件
	 * @return true，保存成功
	 */
	public boolean save_file(String fileName, File file) {
		GridFSInputFile gfsInput;
		try {
			final GridFS myFS = new GridFS(db, FS_NAME);
			gfsInput = myFS.createFile(file);
			gfsInput.setFilename(fileName);
			gfsInput.save();
		} catch (IOException e) {
			LOGGER.error(e.getMessage(), e);
			return false;
		}
		return true;
	}

	/**
	 * 通过文件名称读取文件
	 *
	 * @param file_name 文件名称
	 * @return 文件对象（GRIDFS）
	 */
	public GridFSDBFile file_form_name(String file_name) {
		GridFSDBFile gfsFile;
		try {
			gfsFile = new GridFS(db, FS_NAME).findOne(file_name);
		} catch (Exception e) {
			LOGGER.error(e, e);
			return null;
		}
		return gfsFile;
	}

	/**
	 * 从存储中删除文件信息
	 * @param fileName  文件名称
	 */
	public void remove_file(String fileName) {
		new GridFS(db, FS_NAME).remove(fileName);
	}

	/**
	 * 根据ID读取文件
	 *
	 * @param id ID
	 * @return 文件对象
	 */
	public GridFSDBFile file_form_id(String id) {
		GridFSDBFile gfsFile;
		try {
			gfsFile = new GridFS(db, FS_NAME).find(new ObjectId(id));
		} catch (Exception e) {
			LOGGER.error(e, e);
			return null;
		}
		return gfsFile;
	}

	/**
	 * 直接保存文件流信息
	 * @param name 文件名称
	 * @param fileContext  文件内容字节数组
	 */
	public void save_file_byte(String name, byte[] fileContext) {
		GridFSInputFile gfsInput;
		final GridFS myFS = new GridFS(db, FS_NAME);
		gfsInput = myFS.createFile(fileContext);
		gfsInput.setFilename(name);
		gfsInput.save();
	}
}
